polyCylinder -r 0.4 -h 34.5 -sx 16 -sy 1 -sz 1 -ax 0 1 0 -rcp 0 -cuv 3 -ch 1;
rename "pCylinder1" "channelCylinder";
shadingNode -asShader lambert;
rename lambert2 "lpink" ;
sets -renderable true -noSurfaceShader true -empty -name lpinkSG;
connectAttr -f lpink.outColor lpinkSG.surfaceShader;
assignCreatedShader "lambert" "" lpink "channelCylinder";
sets -e -forceElement lpinkSG;
setAttr "lpink.color" -type double3 1 0 1 ;

polyPipe -r 0.7 -h 65 -t 0.299999 -sa 16 -sh 1 -sc 2 -ax 0 1 0 -cuv 1 -rcp 0 -ch 1;
rename "pPipe1" "insulatorPipe";
shadingNode -asShader lambert;
rename lambert2 "lyellow" ;
sets -renderable true -noSurfaceShader true -empty -name lyellowSG;
connectAttr -f lyellow.outColor lyellowSG.surfaceShader;
assignCreatedShader "lambert" "" lyellow "insulatorPipe";
sets -e -forceElement lyellowSG;
setAttr "lyellow.color" -type double3 1 1 0 ;
setAttr "lyellow.transparency" -type double3 0.4 0.4 0.4 ;

polyPipe -r 0.6 -h 2 -t 0.1 -sa 16 -sh 1 -sc 2 -ax 0 1 0 -cuv 1 -rcp 0 -ch 1;
rename "pPipe1" "trapAAPipe1";
setAttr "trapAAPipe1.translateY" -15;
shadingNode -asShader lambert;
rename lambert2 "lred" ;
sets -renderable true -noSurfaceShader true -empty -name lredSG;
connectAttr -f lred.outColor lredSG.surfaceShader;
assignCreatedShader "lambert" "" lred "trapAAPipe1";
sets -e -forceElement lredSG;
setAttr "lred.color" -type double3 1 0 0 ;
duplicate -rr; move -r 0 2 0; for ($i=1; $i<15; ++$i) duplicate -rr -st;

polyPipe -r 1 -h 65 -t 0.3 -sa 16 -sh 1 -sc 2 -ax 0 1 0 -cuv 1 -rcp 0 -ch 1;
rename "pPipe1" "outerPipe";
shadingNode -asShader lambert;
rename lambert2 "lgreen" ;
sets -renderable true -noSurfaceShader true -empty -name lgreenSG;
connectAttr -f lgreen.outColor lgreenSG.surfaceShader;
assignCreatedShader "lambert" "" lgreen "outerPipe";
sets -e -forceElement lgreenSG;
setAttr "lgreen.color" -type double3 0 1 0 ;

select -r channelCylinder insulatorPipe trapAAPipe1 trapAAPipe2 trapAAPipe3 trapAAPipe4 trapAAPipe5 trapAAPipe6 trapAAPipe7 trapAAPipe8 trapAAPipe9 trapAAPipe10 trapAAPipe11 trapAAPipe12 trapAAPipe13 trapAAPipe14 trapAAPipe15 trapAAPipe16 outerPipe ;
doGroup 0 1 1;
rename "group1" "tr16i1";
select -cl  ;
select -r tr16i1 ;
duplicate -rr; move -r 3 0 0; for ($i=1; $i<7; ++$i) duplicate -rr -st;

//create the gate as a cube, position it, assign color//
polyCube -w 23.25 -h 1 -d 2.25 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
rename "pCube1" "gate1";
move -rpr -x 10.5 ;
move -rpr -y -15 ;
setAttr "gate1.scaleZ" 1.1;
setAttr "gate1.scaleX" 1.01;

polyCylinder -r 1 -h 34.5 -sx 16 -sy 1 -sz 1 -ax 0 1 0 -rcp 0 -cuv 3 -ch 1;
duplicate -rr; move -r 3 0 0; for ($i=1; $i<7; ++$i) duplicate -rr -st;

select -r gate1 ;
select -tgl pCylinder1 ;
polyCBoolOp -op 2 -ch 1 -preserveColor 0 -classification 2 -name gate1 gate1 pCylinder1;
select -tgl pCylinder2 ;
polyCBoolOp -op 2 -ch 1 -preserveColor 0 -classification 2 -name gate2 gate2 pCylinder2;
select -tgl pCylinder3 ;
polyCBoolOp -op 2 -ch 1 -preserveColor 0 -classification 2 -name gate3 gate3 pCylinder3;
select -tgl pCylinder4 ;
polyCBoolOp -op 2 -ch 1 -preserveColor 0 -classification 2 -name gate4 gate4 pCylinder4;
select -tgl pCylinder5 ;
polyCBoolOp -op 2 -ch 1 -preserveColor 0 -classification 2 -name gate5 gate5 pCylinder5;
select -tgl pCylinder6 ;
polyCBoolOp -op 2 -ch 1 -preserveColor 0 -classification 2 -name gate6 gate6 pCylinder6;
select -tgl pCylinder7 ;
polyCBoolOp -op 2 -ch 1 -preserveColor 0 -classification 2 -name gate7 gate7 pCylinder7;
select -tgl pCylinder8 ;
polyCBoolOp -op 2 -ch 1 -preserveColor 0 -classification 2 -name gate8 gate8 pCylinder8;
select -r gate9 ;
duplicate -rr; move -r 0 0 0;
select -r gate9 gate8 gate7 gate6 gate5 gate4 gate3 gate2 gate1 pCylinder8 pCylinder7 pCylinder6 pCylinder5 pCylinder4 pCylinder3 pCylinder2 pCylinder1;
doDelete;
select -r gate10 ;
rename "gate10" "gate1";
duplicate -rr; move -r 0 1 0;
rename "gate2" "insulator1";
select -r gate1 ;
shadingNode -asShader lambert;
rename lambert2 "lambertGate" ;
sets -renderable true -noSurfaceShader true -empty -name lambertGateSG;
connectAttr -f lambertGate.outColor lambertGateSG.surfaceShader;
assignCreatedShader "lambert" "" lambertGate "gate1";
sets -e -forceElement lambertGateSG;
setAttr "lambertGate.color" -type double3 1 0 0 ;
select -r gate1 ;
//duplicate the gate 15 times with a y shift//
duplicate -rr; move -r 0 2 0; for ($i=1; $i<15; ++$i) duplicate -rr -st;

//create the insulator as a cube, position it, assign color//
select -r insulator1 ;
setAttr "insulator1.scaleZ" 0.95;
setAttr "insulator1.scaleX" 0.995;
shadingNode -asShader lambert;
rename lambert2 "lambertInsulator" ;
sets -renderable true -noSurfaceShader true -empty -name lambertInsulatorSG;
connectAttr -f lambertInsulator.outColor lambertInsulatorSG.surfaceShader;
assignCreatedShader "lambert" "" lambertInsulator "insulator1";
sets -e -forceElement lambertInsulatorSG;
setAttr "lambertInsulator.color" -type double3 1 1 1 ;
setAttr "lambertInsulator.transparency" -type double3 0.4 0.4 0.4 ;
select -r insulator1 ;
//duplicate the gate 14 times with a y shift//
duplicate -rr; move -r 0 2 0; for ($i=1; $i<14; ++$i) duplicate -rr -st;

//create the wires which connect the bitline to the board//
//1 cube aligned at the required position//
nurbsCube -p 0 0 0 -ax 0 1 0 -w 0.15 -lr 3.333333333 -hr 2.666666667 -d 3 -u 1 -v 1 -ch 1;
rename "nurbsCube1" "wire1";
move -rpr -y 17 ;
move -r 0 0 -0.25 wire1.scalePivot wire1.rotatePivot ;
setAttr "wire1.rotateY" -1.331053;
setAttr "wire1.translateZ" 0.25;
duplicate -rr; move -r 3 0 0; for ($i=1; $i<3; ++$i) duplicate -rr -st;
setAttr "wire1.scaleZ" 3.5;
setAttr "wire2.scaleZ" 9.67665857;
setAttr "wire3.scaleZ" 15.85331714336;
setAttr "wire4.scaleZ" 22.029975715;

nurbsCube -p 0 0 0 -ax 0 1 0 -w 0.5 -lr 0.3 -hr 68.8 -d 3 -u 1 -v 1 -ch 1;
rename "nurbsCube1" "wireV1";
setAttr "wireV1.rotateY" 0.239743109;
move -r -1.69994826 0 0.4155429 ;
duplicate -rr; move -r 0 0 0.73333333; for ($i=1; $i<3; ++$i) duplicate -rr -st;

select -r wire1 wire2 wire3 wire4 wireV1 wireV2 wireV3 wireV4 ;
doGroup 0 1 1;
select -r group1 ;
rename "group1" "bitlinewires1";
//duplicate once and scale with -1 on x, i.e. mirror relative to x-axis;//
duplicate -rr; scale -r -1 1 1; move -r 21 0 0;

// create the gate wires
nurbsCube -p 0 0 0 -ax 0 1 0 -w 0.15 -lr 3.333333333 -hr 2.666666667 -d 3 -u 1 -v 1 -ch 1;
//nurbsCube -p 0 0 0 -ax 0 1 0 -w 0.15 -lr 3.333333 -hr 2.666667 -d 3 -u 1 -v 1 -ch 1;
rename "nurbsCube1" "gatewire1";
setAttr "gatewire1.rotateY" -1.570796;
move -r 0.25 0 0 gatewire1.scalePivot gatewire1.rotatePivot ;
move -rpr -x -1.2 ;
move -rpr -y -15 ;
//duplicate the gatewire 15 times with a y shift//
duplicate -rr; move -r 0 2 0; for ($i=1; $i<15; ++$i) duplicate -rr -st;
setAttr "gatewire1.scaleZ"  1   ;
setAttr "gatewire2.scaleZ"  3   ;
setAttr "gatewire3.scaleZ"  5   ;
setAttr "gatewire4.scaleZ"  7   ;
setAttr "gatewire5.scaleZ"  9   ;
setAttr "gatewire6.scaleZ"  11   ;
setAttr "gatewire7.scaleZ"  13   ;
setAttr "gatewire8.scaleZ"  15   ;
setAttr "gatewire9.scaleZ"  17   ;
setAttr "gatewire10.scaleZ" 19   ;
setAttr "gatewire11.scaleZ" 21   ;
setAttr "gatewire12.scaleZ" 23   ;
setAttr "gatewire13.scaleZ" 25   ;
setAttr "gatewire14.scaleZ" 27   ;
setAttr "gatewire15.scaleZ" 29   ;
setAttr "gatewire16.scaleZ" 31   ;

nurbsCube -p 0 0 0 -ax 0 1 0 -w 0.5 -lr 0.3 -hr 2 -d 3 -u 1 -v 1 -ch 1;
rename "nurbsCube1" "gateVwire1";
move -r 0 0.5 0 gateVwire1.scalePivot gateVwire1.rotatePivot ;
setAttr "gateVwire1.translateY" 14.7;
setAttr "gateVwire1.translateX" -16.7;
duplicate -rr; move -r 1 -2 0; for ($i=1; $i<15; ++$i) duplicate -rr -st;
setAttr "gateVwire1.scaleY"  32.5		;
setAttr "gateVwire2.scaleY"  30.5		;
setAttr "gateVwire3.scaleY"  28.5		;
setAttr "gateVwire4.scaleY"  26.5		;
setAttr "gateVwire5.scaleY"  24.5		;
setAttr "gateVwire6.scaleY"  22.5		;
setAttr "gateVwire7.scaleY"  20.5		;
setAttr "gateVwire8.scaleY"  18.5		;
setAttr "gateVwire9.scaleY"  16.5		;
setAttr "gateVwire10.scaleY" 14.5		;
setAttr "gateVwire11.scaleY" 12.5		;
setAttr "gateVwire12.scaleY" 10.5		;
setAttr "gateVwire13.scaleY" 8.5		;
setAttr "gateVwire14.scaleY" 6.5		;
setAttr "gateVwire15.scaleY" 4.5		;
setAttr "gateVwire16.scaleY" 2.5		;

//group the wires and rename//
select -r gatewire1 gatewire2 gatewire3 gatewire4 gatewire5 gatewire6 gatewire7 gatewire8 gatewire9 gatewire10 gatewire11 gatewire12 gatewire13 gatewire14 gatewire15 gatewire16 gateVwire1 gateVwire2 gateVwire3 gateVwire4 gateVwire5 gateVwire6 gateVwire7 gateVwire8 gateVwire9 gateVwire10 gateVwire11 gateVwire12 gateVwire13 gateVwire14 gateVwire15 gateVwire16;
doGroup 0 1 1;
select -r group1 ;
rename "group1" "gatewires";
select -r gatewires bitlinewires1 bitlinewires2;
doGroup 0 1 1;
select -r group1 ;
rename "group1" "wires";
//assign color//
shadingNode -asShader lambert;
rename lambert2 "lambertWires" ;
sets -renderable true -noSurfaceShader true -empty -name lambertWiresSG;
connectAttr -f lambertWires.outColor lambertWiresSG.surfaceShader;
assignCreatedShader "lambert" "" lambertWires "wires";
sets -e -forceElement lambertWiresSG;
setAttr "lambertWires.color" -type double3 0.231 0.231 0.231 ;
setAttr "lambertWires.transparency" -type double3 0.6 0.6 0.6 ;

//group all cylinders, gate cubes and wires together into one NAND plane//
select -r tr16i1 tr16i2 tr16i3 tr16i4 tr16i5 tr16i6 tr16i7 tr16i8 gate1 gate2 gate3 gate4 gate5 gate6 gate7 gate8 gate9 gate10 gate11 gate12 gate13 gate14 gate15 gate16 insulator1 insulator2 insulator3 insulator4 insulator5 insulator6 insulator7 insulator8 insulator9 insulator10 insulator11 insulator12 insulator13 insulator14 insulator15 wires;
doGroup 0 1 1;
rename "group1" "NAND1";

//duplicate once the NAND plane and group into a macrocell//
duplicate -rr; move -r 0 0 3;
select -r NAND1 NAND2;
doGroup 0 1 1;
rename "group1" "macrocell1";

//duplicate 7 times on z and group//
instance; move -r 0 0 6; for ($i=1; $i<7; ++$i) instance -st;
select -r macrocell1 macrocell2 macrocell3 macrocell4 macrocell5 macrocell6 macrocell7 macrocell8 ;
doGroup 0 1 1;
rename "group1" "block1";

//duplicate 7 times on x and group into a full CPLD//
select -r block1 ;
instance; move -r 41 0 0; for ($i=1; $i<7; ++$i) instance -st;
select -r block1 block2 block3 block4 block5 block6 block7 block8;
doGroup 0 1 1;
rename "group1" "CPLD";

//options to set the camera environment to white - for better rendering//
setAttr "perspShape.backgroundColor" -type double3 1 1 1 ;
setAttr "topShape.backgroundColor" -type double3 1 1 1 ;
setAttr "frontShape.backgroundColor" -type double3 1 1 1 ;
setAttr "sideShape.backgroundColor" -type double3 1 1 1 ;
defaultAmbientLight(1, 0.45, 1,1,1, "0", 0,0,0, "1");
setAttr "ambientLight1.translateY" 35;
setAttr "ambientLight1.translateZ" 22.5;
setAttr "ambientLight1.translateX" 10.5;